﻿Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraSplashScreen
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraEditors
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.Utils.Win

Public Class BoPhan1
    Private State As Integer = 0 'trạng thái form 
    '0 mặc định
    '1 tạo mới
    '2 sửa
    '3 xóa
    Private Sub setReadonlyCT(ByVal b As Boolean)
        Me.MaTextEdit.Properties.ReadOnly = b
        Me.TenTextEdit.Properties.ReadOnly = b
        Me.DiachiTextEdit.Properties.ReadOnly = b
    End Sub
    Private Sub setReadonlyDS(ByVal b As Boolean) 'set readonly để không cho thao tác khi ở trạng thái mặc định - cho thao tác khi ở tạo mới - sửa

        If b Then 'trong trạng thái readonly thì không cho nhập và dòng trống thêm ở cuối
            Me.IGridView1.OptionsBehavior.Editable = False
            Me.IGridView1.OptionsView.NewItemRowPosition = DevExpress.XtraGrid.Views.Grid.NewItemRowPosition.None
        Else 'cho thêm dòng trống ở cuối
            Me.IGridView1.OptionsBehavior.Editable = True
            Me.IGridView1.OptionsView.NewItemRowPosition = DevExpress.XtraGrid.Views.Grid.NewItemRowPosition.Bottom
        End If
    End Sub
    'nút thoát
    Private Sub BarButtonItemThoat_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemThoat.ItemClick
        Me.Dispose() 'chạy hàm này để giải phóng ram
        Me.Close() 'đóng form
    End Sub
    Private Sub setButtonTrangThaiSua(ByVal b As Boolean) 'set nút lưu và xóa - khi ở trạng thái sửa thì mới cho phép thao tác trên nó (enable = true) - các trạng thái khác thì không cho (enable = false)
        Me.BarButtonItemLuu.Enabled = b
        Me.BarButtonItemXoa.Enabled = b
        If b Then 'xử lý nút sửa (nếu nút lưu - xóa cho phép thì sửa ko cho phép và ngược lại)
            Me.BarButtonItemSua.Enabled = False
        Else
            Me.BarButtonItemSua.Enabled = True
        End If
    End Sub
    Private Sub loadDuLieu()
        SplashScreenManager.ShowForm(GetType(WaitForm1))
        Me.BophanTableAdapter.Fill(Me.PcvgppDataSet.bophan)
        Me.setReadonlyDS(True)
        Me.setReadonlyCT(True)
        Me.setButtonTrangThaiSua(False)
        SplashScreenManager.CloseForm()
    End Sub
    Private Sub BoPhan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        loadDuLieu()
        Me.BophanIGridControl.ForceInitialize()
        Me.IGridView1.MoveLast()
        Me.State = 0

        'Me.IGridView1.BestFitColumns() 'tự co dãn các cột của igridview dựa vào độ dài cột dữ liệu

    End Sub
    'nút tạo mới
    Private Sub BarButtonItemTaoMoi_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemTaoMoi.ItemClick
        If Me.BarCheckItemNhapNhanh.Checked Then
            Me.State = 1 'trạng thái tạo mới
            Me.setReadonlyDS(False)
            Me.setReadonlyCT(True)
            Me.setButtonTrangThaiSua(True)
            Me.IGridView1.MoveLast()
            Me.IGridView1.Focus()
            Me.IGridView1.AddNewRow()
            Me.IGridView1.FocusedColumn = Me.IGridView1.VisibleColumns(0)
            Me.IGridView1.ShowEditor()
        Else
            Try
                Me.setReadonlyDS(True)
                Me.setReadonlyCT(False)
                Me.setButtonTrangThaiSua(True)
                Me.MaTextEdit.Focus() 'bắt con trỏ ở mã khi tạo mới
                Me.BophanBindingSource.AddNew() 'thêm một item mới trong bindingsource
                Me.State = 1 'trạng thái tạo mới
            Catch ex As Exception
                'khi có lỗi - ngoại lệ xảy ra
            End Try
        End If


    End Sub
    'nút Lưu
    Private Sub BarButtonItemLuu_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemLuu.ItemClick
        Try
            Me.IGridView1.PostEditor()
            Me.IGridView1.UpdateCurrentRow()
            Me.IGridView1.CloseEditor()
            Me.BophanBindingSource.EndEdit() 'end edit trước khi lưu - ghi những thay đổi 
            If Me.PcvgppDataSet.HasChanges Then 'coi có thay đổi dữ liệu hay ko ?
                If DevExpress.XtraEditors.XtraMessageBox.Show("Bạn có muốn 'Lưu' không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes Then
                    Try
                        Me.BophanTableAdapter.Update(Me.PcvgppDataSet.bophan)
                        Me.State = 0 'trở về trạng thái mặc định 0
                        Me.setReadonlyDS(True) 'set lại readonly
                        Me.setReadonlyCT(True)
                        setButtonTrangThaiSua(False) 'set lại nút 
                    Catch ex As Exception

                    End Try
                End If
            Else 'nếu ko thay đổi dữ liệu
                DevExpress.XtraEditors.XtraMessageBox.Show("Chưa có thay đổi dữ liệu ?", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.State = 0
                Me.setReadonlyDS(True) 'set lại readonly
                Me.setReadonlyCT(True)
                setButtonTrangThaiSua(False) 'set lại nút 
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message) 'tung message khi có ngoại lệ
        End Try
    End Sub
    Private Function getKiemTraMaTonTai(ByVal sMa As String) As Boolean 'kiểm tra sự tồn tại của mã - dùng kiểm tra chung với igridview
        If Me.BophanBindingSource.Find("ma", sMa) = -1 Then 'nếu -1 nghĩa là ko tìm đc vị trí trong bindingsource
            Return False
        Else 'còn lại là tìm đc vị trí --> đã tồn tại
            Return True
        End If
    End Function
    'bắt lỗi mã
    Private Sub MaTextEdit_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MaTextEdit.Validating
        If State = 1 And Not Me.BarCheckItemNhapNhanh.Checked Then 'xác định chỉ kiểm tra trong trường hợp tạo mới
            Try
                If Me.getKiemTraMaTonTai(Me.MaTextEdit.EditValue) Then 'kiểm tra mã tồn tại hay chưa ?
                    Me.MaTextEdit.ErrorText = "Mã này đã tồn tại"

                    e.Cancel = True
                End If
            Catch ex As Exception

            End Try
        End If
    End Sub
    'nút Sửa
    Private Sub BarButtonItemSua_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemSua.ItemClick
        Me.setReadonlyDS(False)
        Me.setReadonlyCT(False)
        Me.setButtonTrangThaiSua(True)
        Me.State = 2
    End Sub
    'nút xóa 
    Private Sub BarButtonItemXoa_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemXoa.ItemClick
        If DevExpress.XtraEditors.XtraMessageBox.Show("Bạn có muốn xóa '" & Me.MaTextEdit.EditValue & "' không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes Then
            Me.BophanBindingSource.RemoveCurrent()
            Me.BophanTableAdapter.Update(Me.PcvgppDataSet.bophan)
            Me.State = 0
            Me.setReadonlyDS(True)
            Me.setReadonlyCT(True)
            Me.setButtonTrangThaiSua(False)
        End If
    End Sub
    'hủy thay đổi 
    Private Sub BarButtonItemHuyThayDoi_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemHuyThayDoi.ItemClick
        Me.BophanBindingSource.EndEdit()
        If Me.PcvgppDataSet.HasChanges Then
            If DevExpress.XtraEditors.XtraMessageBox.Show("Bạn có muốn hủy tất cả những thay đổi đang làm không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes Then
                Me.PcvgppDataSet.RejectChanges()
                Me.State = 0
                Me.setReadonlyDS(True)
                Me.setReadonlyCT(True)
                Me.setButtonTrangThaiSua(False)
            End If
        Else
            DevExpress.XtraEditors.XtraMessageBox.Show("Chưa có thay đổi dữ liệu ?", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Me.State = 0
            Me.setReadonlyDS(True)
            Me.setReadonlyCT(True)
            Me.setButtonTrangThaiSua(False)
        End If

    End Sub
    'nút First - vị trí đầu tiên
    Private Sub BarButtonItemFirst_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemFirst.ItemClick
        Me.BophanBindingSource.MoveFirst()
    End Sub
    'Nút Previous -vị trí trước
    Private Sub BarButtonItem2_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemPrevious.ItemClick
        Me.BophanBindingSource.MovePrevious()
    End Sub
    'Nút Next vị trí sau
    Private Sub BarButtonItem6_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemNext.ItemClick
        Me.BophanBindingSource.MoveNext()
    End Sub
    'Nút Last - vị trí cuối
    Private Sub BarButtonItem7_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemLast.ItemClick
        Me.BophanBindingSource.MoveLast()
    End Sub
    'nút in
    Private Sub BarButtonItemIn_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemIn.ItemClick
        Dim report As XtraReportBoPhan = New XtraReportBoPhan
        report.ShowRibbonPreview()
    End Sub
    '=========== xử lý bắt lỗi trên igridview - để nhập trực tiếp nhiều dòng =========================
    'bật chức năng xem xét trong trạng thái sửa (modified)
    Private Sub IGridView1_ShownEditor(ByVal sender As Object, ByVal e As System.EventArgs) Handles IGridView1.ShownEditor
        Dim view As ColumnView = CType(sender, ColumnView)
        view.ActiveEditor.IsModified = True
    End Sub
    'kiểm tra giá trị cột đang thao tác 
    Private Sub IGridView1_ValidatingEditor(ByVal sender As Object, ByVal e As DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs) Handles IGridView1.ValidatingEditor
        If Me.IGridView1.FocusedColumn.FieldName = "ma" And IGridView1.FocusedRowHandle <> -999997 Then
            If IsDBNull(e.Value) Or IsNothing(e.Value) Then
                e.ErrorText = "Mã không được rỗng !"
                e.Valid = False
                Exit Sub
            ElseIf e.Value.ToString.Trim = "" Then
                e.ErrorText = "Mã không được rỗng !"
                e.Valid = False
                Exit Sub
            End If
            If Me.getKiemTraMaTonTai(e.Value) And State = 1 Then
                e.ErrorText = "Mã '" & e.Value & "'đã tồn tại !"
                e.Valid = False
            End If
        ElseIf Me.IGridView1.FocusedColumn.FieldName = "ten" And IGridView1.FocusedRowHandle <> -999997 Then
            If IsDBNull(e.Value) Or IsNothing(e.Value) Then
                e.ErrorText = "Tên không được rỗng !"
                e.Valid = False
            ElseIf e.Value.ToString.Trim = "" Then
                e.ErrorText = "Tên không được rỗng !"
                e.Valid = False
            End If
        End If
    End Sub

    Private Sub BarButtonItemLamTuoi_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemLamTuoi.ItemClick
        Dim position As Integer = Me.BophanBindingSource.Position
        Me.State = 0
        loadDuLieu()
        Me.BophanBindingSource.Position = position
    End Sub

    Private Sub BophanBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.Validate()
        Me.BophanBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.PcvgppDataSet)

    End Sub
End Class